from aiogram import Bot, Dispatcher, F
from aiogram.filters import Command, CommandStart, Text
from aiogram.fsm.context import FSMContext
from aiogram.fsm.state import any_state
from aiogram.types import CallbackQuery, Message
from sqlalchemy.ext.asyncio import AsyncSession

from app.bot.keyboards.inline import subscribe_button
from app.bot.keyboards.reply import admin_keyboard, user_keyboard
from app.config import Settings
from app.database.functions.user import add_user, get_user


async def cmd_cancel(message: Message, config: Settings, state: FSMContext) -> None:
    await state.clear()
    if message.from_user.id in config.tg_bot.admin_ids:
        await message.answer(text="Действие отменено", reply_markup=admin_keyboard())
    else:
        await message.answer(text="Действие отменено", reply_markup=user_keyboard())


async def start(
    message: Message, config: Settings, session: AsyncSession, state: FSMContext
) -> None:
    """
    Стартовое сообщение с фильтром на админа
    """

    if message.from_user.id in config.tg_bot.admin_ids:
        if not await get_user(session, message.from_user.id):
            await add_user(session, message.from_user.id)
        await message.answer("Вы админ этого бота", reply_markup=admin_keyboard())
    else:
        if not await get_user(session, message.from_user.id):
            txt = (
                f"Приветствую, {message.from_user.first_name}!\n\n"
                f"В нашем боте вы можете:\n"
                f"1. Разбанить любой аккаунт/пройти зрд и т д (смотри инструкцию https://t.me/fb_update/2554)\n"
                f"2. Поставить неограниченное количество лайков любой ФП или посту в Facebook (смотри инструкцию https://t.me/fb_update/2560)\n"
                f"3. Откомментировать любой пост в ФП (смотри инструкцию https://t.me/fb_update/2560)\n"
                f"4. Сгенерировать документы для проходждения ЗРД (смотри инструкцию https://t.me/fb_update/2583)\n"
                f"5. Сконвертировать exel файл с аккаунтами в txt формат (смотри инструкцию https://t.me/fb_update/2557)\n"
                f"\nЧтобы использовать функционал бота, необходимо подписаться на:\n"
                f"- https://t.me/fb_update\n"
                f"- https://t.me/SocroboticStoreBot\n"
                f"- https://t.me/socrobotic_official\n"
            )
            await message.answer(
                txt, reply_markup=subscribe_button(), disable_web_page_preview=True
            )
        else:
            txt = (
                f"С возвращение, {message.from_user.first_name}!\n"
                f"Рады видеть Вас вновь в нашем боте\n"
            )
            await message.answer(txt, reply_markup=user_keyboard())
            if not await get_user(session, message.from_user.id):
                await add_user(session, message.from_user.id)


async def help(message: Message, state: FSMContext) -> None:
    await message.answer(
        "Вы можете задать интересующий вас вопрос в нашем боте техподдержки @SocroboticHelp_bot"
    )


async def check_subscription(
    call: CallbackQuery, bot: Bot, session: AsyncSession, state: FSMContext
) -> None:
    user_status = await bot.get_chat_member(
        chat_id="-1001323824093", user_id=call.from_user.id
    )
    user_status1 = await bot.get_chat_member(
        chat_id="-1001367567930", user_id=call.from_user.id
    )
    if user_status.status != "left" and user_status1.status != "left":
        await call.message.delete()
        if not await get_user(session, call.from_user.id):
            await add_user(session, call.from_user.id)
        await call.message.answer(
            "Теперь вам доступен функционал бота", reply_markup=user_keyboard()
        )
    else:
        await call.answer("Вы не подписались на каналы", show_alert=True)


def register_base_handlers(dp: Dispatcher):
    dp.message.register(start, CommandStart(), any_state)
    dp.message.register(start, Text(text="Завершить", ignore_case=True), any_state)
    dp.message.register(help, Command(commands=["help"]), any_state)
    dp.message.register(cmd_cancel, Command(commands=["cancel"]), any_state)
    dp.callback_query.register(
        check_subscription, F.data == "check_subscribe", any_state
    )